package ar.uba.fi.algo3.algoTank.TesteosAlgoTank;


import ar.uba.fi.algo3.algoTank.Objetos.BloqueConcreto;
import ar.uba.fi.algo3.algoTank.Objetos.Posicion;
import ar.uba.fi.algo3.algoTank.Objetos.Territorio;
import ar.uba.fi.algo3.algoTank.Objetos.Equipamiento.Canion;
import ar.uba.fi.algo3.algoTank.Objetos.Equipamiento.Cohete;
import ar.uba.fi.algo3.algoTank.Objetos.Tanques.AlgoTank;
import junit.framework.TestCase;

public class TestAlgoTank extends TestCase {
	
	private AlgoTank algoTank;
	private AlgoTank otroAlgoTank;
	private Territorio territorio;
	private BloqueConcreto bloque;
	


	
	public void setUp(){
		territorio= new Territorio();
		algoTank = new AlgoTank(new Posicion(50,50),territorio);
		algoTank.mirarDerecha();

		otroAlgoTank = new AlgoTank(new Posicion(30,30),territorio);
		otroAlgoTank.mirarDerecha();

	
	}
	
	public void testCargarCanion(){
		
		//Cargar nueva Arma Canion con 10 municiones.-
		algoTank.obtenerCanion(new Canion(),10);
		assertEquals(algoTank.CantidadMunicionesCanion(),10); 	
	}
	
	public void testDescontarMunicionCanion(){
		
		algoTank.obtenerCanion(new Canion(), 10);
		//vivir 4 veces para que se cumpla la cantidad de ciclos necesaria para poder disparar
		this.cantidadDeCiclosParadisparar();
		algoTank.disparar();
		
		assertEquals(algoTank.CantidadMunicionesCanion(),9); 
	}
	
		public void testCargarCohete(){
		
		//Cargar nueva Arma Cohete con 10 municiones.-
		algoTank.obtenerCohete(new Cohete(),5);
		assertEquals(algoTank.CantidadMunicionesCohete(),5); 	
	}
		
	public void testDescontarMunicionCohete(){
			
		algoTank.obtenerCohete(new Cohete(), 5);
		//vivir 4 veces para que se cumpla la cantidad de ciclos necesaria para poder disparar
		this.cantidadDeCiclosParadisparar();
		algoTank.disparar();
		
		assertEquals(algoTank.CantidadMunicionesCohete(), 4); 
	}
	
	public void testCargarDosArmas(){
		
		// Cargo Dos Armas
		algoTank.obtenerCohete(new Cohete(), 5);
		algoTank.obtenerCanion(new Canion(), 10);
		
		assertEquals(algoTank.CantidadMunicionesCanion(), 10 );
		assertEquals(algoTank.CantidadMunicionesCohete(), 5 );
	}
	
	public void testDispararConDosArmas(){
		
		algoTank.obtenerCanion(new Canion(), 10);
		algoTank.obtenerCohete(new Cohete(), 5);
		
		this.cantidadDeCiclosParadisparar();
		// Disparo con la ultima arma (cohete)
		algoTank.disparar();
		assertEquals(algoTank.CantidadMunicionesCohete(), 4);
		assertEquals(algoTank.CantidadMunicionesCanion(), 10);
		
		// disparo 4 cohetes mas
		for(int i = 0 ; i<4; i++){
			this.cantidadDeCiclosParadisparar();
			algoTank.disparar();
		}
		assertEquals(algoTank.CantidadMunicionesCohete(), 0);
		assertEquals(algoTank.CantidadMunicionesCanion(), 10);
		
		this.cantidadDeCiclosParadisparar();
		//si disparo de nuevo tiene que usar el canion
		algoTank.disparar();
		
		assertEquals(algoTank.CantidadMunicionesCanion(),9);		
	}
	
	
	public void testEnergiaInicial(){
		
		assertEquals(algoTank.getEnergia(),100,0.1);	
	}
	
	public void testAumentarEnergia(){
		
		algoTank.aumentarVidaEnPorciento(50);
		assertEquals(algoTank.getEnergia(),150,0.1);	
	}
	
	public void testAumentarVelocidad(){
		
		algoTank.aumentarVelocidadEnPorciento(100);
		assertEquals(algoTank.getMovimiento().getVelocidad(),10,0.1);
		
	}

	public void testMoverAlgoTank(){
		
	
		assertEquals(algoTank.getUbicacion().getPosicion().getY(),50,0.1);
		assertEquals(algoTank.getUbicacion().getPosicion().getX(),50,0.1);
		
		algoTank.mover();
		assertEquals(algoTank.getUbicacion().getPosicion().getY(),50,0.1);
		assertEquals(algoTank.getUbicacion().getPosicion().getX(),55,0.1);
		
		algoTank.moverIzquierda();
		assertEquals(algoTank.getUbicacion().getPosicion().getY(),50,0.1);
		assertEquals(algoTank.getUbicacion().getPosicion().getX(),50,0.1);
		
		algoTank.moverAbajo();
		algoTank.moverAbajo();
		assertEquals(algoTank.getUbicacion().getPosicion().getY(),60,0.1);
		assertEquals(algoTank.getUbicacion().getPosicion().getX(),50,0.1);
	}

	
	
	public void testChocarConBolque(){
		
			bloque= new BloqueConcreto(new Posicion(80,50), territorio);
			territorio.addObjeto(algoTank);
			territorio.addObjeto(bloque);
			
			//me fijo que esta en la pos. que fue ingresada
			assertEquals(algoTank.getUbicacion().getPosicion().getX(),50,0.1);
			assertEquals(algoTank.getUbicacion().getPosicion().getY(),50,0.1);
			assertEquals(bloque.getUbicacion().getPosicion().getX(),80,0.1);
			assertEquals(bloque.getUbicacion().getPosicion().getY(),50,0.1);
			
			
			assertFalse(territorio.ubicacionLibre(bloque.getUbicacion()));
			
			
			algoTank.calcularProximaUbicacion();
			assertEquals(algoTank.getProximaUbicacion().getPosicion().getX(),55,0.1);
			assertEquals(algoTank.getProximaUbicacion().getPosicion().getY(),50,0.1);
			assertEquals(algoTank.getUbicacion().getPosicion().getX(),50,0.1);
			assertEquals(algoTank.getUbicacion().getPosicion().getY(),50,0.1);

			algoTank.mover();
			assertEquals(algoTank.getUbicacion().getPosicion().getX(),55,0.1);
			
			algoTank.mover();			
			assertEquals(algoTank.getUbicacion().getPosicion().getX(),60,0.1);

			//me fijo que no pudo avanzar
			algoTank.mover();
			assertEquals(algoTank.getUbicacion().getPosicion().getX(),60,0.1);
			

			assertEquals(territorio.obtenerParedes().size(),1);
			bloque.morir();
			territorio.actualizar();
			assertEquals(territorio.obtenerParedes().size(),0);
			
			algoTank.mover();
			assertEquals(algoTank.getUbicacion().getPosicion().getX(),65,0.1);
			assertEquals(algoTank.getUbicacion().getPosicion().getY(),50,0.1);
			
	
	}
	
	public void cantidadDeCiclosParadisparar(){
		
		for(int i=0;i<5;i++){
			algoTank.vivir();
		}
		
		
	}
}

